﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.ObjectModel;
using DataAccessComponents;
using DAL;

namespace BusinessLogicLayer
{
   public class KlientBL : IBusinessLogicLayer<Klient>
    {
        private DbOperations dal = new DbOperations();

        /// <summary>
        /// Funkcja dodawająca klient do bazy danych
        /// </summary>
        /// <param name="objDodaj">Obiekt Klient</param>
        /// <returns></returns>
        public int dodaj(Klient objDodaj)
        {
            AdresBL adresBL = new AdresBL();
            int idklienta = sprawdzCzyIstnieje(objDodaj);
            if (idklienta == 0)
            {
                
                objDodaj.Id_adres = adresBL.dodaj(objDodaj.Adres);
                return dal.dodajKlient(objDodaj);
            }
            else
            {
                Klient klient = this.pobierz(idklienta);
                klient.Email = objDodaj.Email;
                klient.Tel_komorkowy = objDodaj.Tel_komorkowy;

                

                int idadres = adresBL.sprawdzCzyIstnieje(objDodaj.Adres);
                if (idadres == 0 || (idadres!=klient.Id_adres))
                {
                    klient.Id_adres = adresBL.dodaj(objDodaj.Adres);
                }
                this.aktualizuj(klient);
                return klient.Id_klient;
            }            
        }

        public int sprawdzCzyIstnieje(Klient objKlient)
        {
            ObservableCollection<Klient> listaKlient = new ObservableCollection<Klient>();
            listaKlient = this.pobierzListe();
            foreach (Klient klient in listaKlient)
            {
                if (objKlient.Equals(klient))
                {
                    return klient.Id_klient;
                }
            }
            return 0;
        }

        /// <summary>
        /// Funkcja usuwająca klient z bazy danych
        /// </summary>
        /// <param name="idusun">Id klient do usunięcia</param>
        public void usun(int idusun)
        {
           
            RezerwacjaBL rezerwacjaBL = new RezerwacjaBL();   

            // Pobieranie uslug klienta
            ObservableCollection<KlientUslugi> listauslug = pobierzUslugiKlient(idusun);


            foreach (KlientUslugi ku in listauslug)
            {
                //Usuwanie z tabeli rezerwacja
                rezerwacjaBL.usun(ku.Rezerwacja.Id_rezerwacja);
            }
            
            // Usuwanie klienta
            dal.usunKlient(idusun);
        }

        /// <summary>
        /// Funkcja akutualizująca klient w bazie danych
        /// </summary>
        /// <param name="objDodaj">Obiekt klient zawierający inforamacje do aktualizacji</param>
        public void aktualizuj(Klient objAktualizuj)
        {
            AdresBL adresBL = new AdresBL();
            adresBL.aktualizuj(objAktualizuj.Adres);
            dal.aktualizujKlient(objAktualizuj);
        }

        /// <summary>
        /// Pobiera objDodaj na podstawie id klient
        /// </summary>
        /// <param name="idusun">Id klient</param>
        /// <returns>Obiekt Klient</returns>
        public Klient pobierz(int idpobierz)
        {
            AdresBL adresBL = new AdresBL();
            

            Klient klient = dal.pobierzKlient(idpobierz);

            // Pobieranie dodatkowych danych
            klient.Adres = adresBL.pobierz(klient.Id_adres);
            


            return klient;
        }       
        
        /// <summary>
        /// Pobiera liste klientow o podanym statusie
        /// </summary>
        /// <param name="idstatus">Id status</param>
        /// <returns></returns>
        public ObservableCollection<Klient> pobierzListe(int idstatus)
        {
            ObservableCollection<Klient> lista = dal.pobierzListeKlientow(idstatus);
            AdresBL adresBL = new AdresBL();
            
            foreach (Klient klient in lista)
            {
                klient.Adres = adresBL.pobierz(klient.Id_adres);
                
            }               
            return lista;
        }

        /// <summary>
        /// Pobiera liste klientow którzy zezwolili na wysyłanie email
        /// </summary>
        /// <param name="idstatus">Id status</param>
        /// <returns></returns>
        public ObservableCollection<Klient> pobierzListeEmail()
        {
            ObservableCollection<Klient> lista = dal.pobierzListeKlientowEmail();
            AdresBL adresBL = new AdresBL();
            
            foreach (Klient klient in lista)
            {
                klient.Adres = adresBL.pobierz(klient.Id_adres);
                
            }
            return lista;
        }

        /// <summary>
        /// Pobiera liste klientow którzy zezwolili na wysyłanie sms
        /// </summary>
        /// <param name="idstatus">Id status</param>
        /// <returns></returns>
        public ObservableCollection<Klient> pobierzListeSMS()
        {
            ObservableCollection<Klient> lista = dal.pobierzListeKlientowSMS();
            AdresBL adresBL = new AdresBL();
            
            foreach (Klient klient in lista)
            {
                klient.Adres = adresBL.pobierz(klient.Id_adres);
                
            }
            return lista;
        }

        /// <summary>
        /// Pobiera liste wszystkich klientow 
        /// </summary>        
        /// <returns></returns>
        public ObservableCollection<Klient> pobierzListe()
        {
            ObservableCollection<Klient> lista = dal.pobierzListeKlientow();
            AdresBL adresBL = new AdresBL();
            
            foreach (Klient klient in lista)
            {
                klient.Adres = adresBL.pobierz(klient.Id_adres);
                
            }
            return lista;
        }

        public ObservableCollection<KlientUslugi> pobierzUslugiKlient(int idklient)
        {
            ObservableCollection<KlientUslugi> listaklientUslugi = dal.pobierzUslugiKlient(idklient);
//            ZdjecieBL zdjecieBL = new ZdjecieBL();
            RezerwacjaBL rezerwacjaBL = new RezerwacjaBL();
            OfertaBL ofertaBL = new OfertaBL();
            TerminBL terminBL = new TerminBL();
            foreach (KlientUslugi ku in listaklientUslugi)
            {
                ku.Rezerwacja = rezerwacjaBL.pobierz(ku.Id_rezerwacja);
                ku.Oferta = ofertaBL.pobierz(ku.Id_oferta);
                ku.Termin = terminBL.pobierz(ku.Id_termin);
  //              ku.Zdjecie = zdjecieBL.pobierzBitmapImage(ku.Id_zdjecia);
            }

            return listaklientUslugi;
        }

        public bool aktualizujListe(ObservableCollection<Klient> lista)
        {
            foreach (Klient kli in lista)
            {
                aktualizuj(kli);
            }
            return true;
        }
        public bool usun(ObservableCollection<Klient> lista)
        {
         //   AdresBL adresBL = new AdresBL();
            foreach (Klient kli in lista)
            {
                usun(kli.Id_klient);
           //     adresBL.usun(kli.Id_adres);
            }
            return true;

        }


       
    }
}
